home *** CD-ROM | disk | FTP | other *** search
/ Programming Windows (5th Edition) / Programming Windows, 5th ed. - Companion CD (097-0002183)(1999).iso / Chap12 / ClipText / ClipText.c next >
Encoding:
C/C++ Source or Header  |  1998-10-09  |  5.7 KB  |  185 lines

  1. /*-----------------------------------------
  2.    CLIPTEXT.C -- The Clipboard and Text
  3.                  (c) Charles Petzold, 1998
  4.   -----------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include "resource.h"
  8.  
  9. LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
  10.  
  11. #ifdef UNICODE
  12.  
  13. #define CF_TCHAR CF_UNICODETEXT
  14. TCHAR szDefaultText[] = TEXT ("Default Text - Unicode Version") ;
  15. TCHAR szCaption[]     = TEXT ("Clipboard Text Transfers - Unicode Version") ;
  16.  
  17. #else
  18.  
  19. #define CF_TCHAR CF_TEXT
  20. TCHAR szDefaultText[] = TEXT ("Default Text - ANSI Version") ;
  21. TCHAR szCaption[]     = TEXT ("Clipboard Text Transfers - ANSI Version") ;
  22.  
  23. #endif
  24.  
  25. int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
  26.                     PSTR szCmdLine, int iCmdShow)
  27. {
  28.      static TCHAR szAppName[] = TEXT ("ClipText") ;
  29.      HACCEL       hAccel ;
  30.      HWND         hwnd ;
  31.      MSG          msg ;
  32.      WNDCLASS     wndclass ;
  33.      
  34.      wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
  35.      wndclass.lpfnWndProc   = WndProc ;
  36.      wndclass.cbClsExtra    = 0 ;
  37.      wndclass.cbWndExtra    = 0 ;
  38.      wndclass.hInstance     = hInstance ;
  39.      wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
  40.      wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
  41.      wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
  42.      wndclass.lpszMenuName  = szAppName ;
  43.      wndclass.lpszClassName = szAppName ;
  44.      
  45.      if (!RegisterClass (&wndclass))
  46.      {
  47.           MessageBox (NULL, TEXT ("This program requires Windows NT!"),
  48.                       szAppName, MB_ICONERROR) ;
  49.           return 0 ;
  50.      }
  51.      
  52.      hwnd = CreateWindow (szAppName, szCaption,
  53.                           WS_OVERLAPPEDWINDOW,
  54.                           CW_USEDEFAULT, CW_USEDEFAULT,
  55.                           CW_USEDEFAULT, CW_USEDEFAULT,
  56.                           NULL, NULL, hInstance, NULL) ;
  57.      
  58.      ShowWindow (hwnd, iCmdShow) ;
  59.      UpdateWindow (hwnd) ;
  60.  
  61.      hAccel = LoadAccelerators (hInstance, szAppName) ;
  62.  
  63.      while (GetMessage (&msg, NULL, 0, 0))
  64.      {
  65.           if (!TranslateAccelerator (hwnd, hAccel, &msg))
  66.           {
  67.                TranslateMessage (&msg) ;
  68.                DispatchMessage (&msg) ;
  69.           }
  70.      }
  71.      return msg.wParam ;
  72. }
  73.  
  74. LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
  75. {
  76.      static PTSTR pText ;
  77.      BOOL         bEnable ;
  78.      HGLOBAL      hGlobal ;
  79.      HDC          hdc ;
  80.      PTSTR        pGlobal ;
  81.      PAINTSTRUCT  ps ;
  82.      RECT         rect ;
  83.      
  84.      switch (message)
  85.      {
  86.      case WM_CREATE:
  87.           SendMessage (hwnd, WM_COMMAND, IDM_EDIT_RESET, 0) ;
  88.           return 0 ;
  89.  
  90.     case WM_INITMENUPOPUP:
  91.           EnableMenuItem ((HMENU) wParam, IDM_EDIT_PASTE,
  92.                IsClipboardFormatAvailable (CF_TCHAR) ? MF_ENABLED : MF_GRAYED) ;
  93.  
  94.           bEnable = pText ? MF_ENABLED : MF_GRAYED ;
  95.  
  96.           EnableMenuItem ((HMENU) wParam, IDM_EDIT_CUT,   bEnable) ;
  97.           EnableMenuItem ((HMENU) wParam, IDM_EDIT_COPY,  bEnable) ;
  98.           EnableMenuItem ((HMENU) wParam, IDM_EDIT_CLEAR, bEnable) ;
  99.           break ;
  100.           
  101.      case WM_COMMAND:
  102.           switch (LOWORD (wParam))
  103.           {
  104.           case IDM_EDIT_PASTE:
  105.                OpenClipboard (hwnd) ;
  106.  
  107.                if (hGlobal = GetClipboardData (CF_TCHAR))
  108.                {
  109.                     pGlobal = GlobalLock (hGlobal) ;
  110.  
  111.                     if (pText)
  112.                     {
  113.                          free (pText) ;
  114.                          pText = NULL ;
  115.                     }
  116.                     pText = malloc (GlobalSize (hGlobal)) ;
  117.                     lstrcpy (pText, pGlobal) ;
  118.                     InvalidateRect (hwnd, NULL, TRUE) ;
  119.                }
  120.                CloseClipboard () ;
  121.                return 0 ;
  122.  
  123.           case IDM_EDIT_CUT:
  124.           case IDM_EDIT_COPY:
  125.                if (!pText)
  126.                     return 0 ;
  127.  
  128.                hGlobal = GlobalAlloc (GHND | GMEM_SHARE, 
  129.                                       (lstrlen (pText) + 1) * sizeof (TCHAR)) ;
  130.                pGlobal = GlobalLock (hGlobal) ;
  131.                lstrcpy (pGlobal, pText) ;
  132.                GlobalUnlock (hGlobal) ;
  133.  
  134.                OpenClipboard (hwnd) ;
  135.                EmptyClipboard () ;
  136.                SetClipboardData (CF_TCHAR, hGlobal) ;
  137.                CloseClipboard () ;
  138.  
  139.                if (LOWORD (wParam) == IDM_EDIT_COPY)
  140.                     return 0 ;        
  141.                                              // fall through for IDM_EDIT_CUT
  142.           case IDM_EDIT_CLEAR:
  143.                if (pText)
  144.                {
  145.                     free (pText) ;
  146.                     pText = NULL ;
  147.                }
  148.                InvalidateRect (hwnd, NULL, TRUE) ;
  149.                return 0 ;
  150.  
  151.           case IDM_EDIT_RESET:
  152.                if (pText)
  153.                {
  154.                     free (pText) ;
  155.                     pText = NULL ;
  156.                }
  157.  
  158.                pText = malloc ((lstrlen (szDefaultText) + 1) * sizeof (TCHAR)) ;
  159.                lstrcpy (pText, szDefaultText) ;
  160.                InvalidateRect (hwnd, NULL, TRUE) ;
  161.                return 0 ;
  162.           }
  163.           break ;
  164.  
  165.      case WM_PAINT:
  166.           hdc = BeginPaint (hwnd, &ps) ;
  167.  
  168.           GetClientRect (hwnd, &rect) ;
  169.           
  170.           if (pText != NULL)
  171.                DrawText (hdc, pText, -1, &rect, DT_EXPANDTABS | DT_WORDBREAK) ;
  172.  
  173.           EndPaint (hwnd, &ps) ;
  174.           return 0 ;
  175.           
  176.      case WM_DESTROY:
  177.           if (pText)
  178.                free (pText) ;
  179.  
  180.           PostQuitMessage (0) ;
  181.           return 0 ;
  182.      }
  183.      return DefWindowProc (hwnd, message, wParam, lParam) ;
  184. }
  185.